﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for WebServiceAgent
/// </summary>
public class WebServiceAgent
{

    #region Attributes
    private ERPSIA.IServiceContract _webService;
    private ERPSIA.Item[] _items;
    private ERPSIA.StoreRoom[] _storeRooms;
    private ERPSIA.Tax _defaultTax;
    private ERPSIA.AuxiliarAccount[] _clients;
    private ERPSIA.Currency[] _currencies;
    private ERPSIA.SaleReport[] _saleReports;
    #endregion

    #region Constructor
    public WebServiceAgent()
    {
        _webService = new ERPSIA.ServiceContractClient();
    }
    #endregion

    #region Public Methods

    /// <summary>
    /// Autentica al vendedor que ingresa a la página
    /// </summary>
    /// <param name="username">Usuario del vendedor</param>
    /// <param name="password">Contraseña del vendedor</param>
    /// <param name="company">Nombre de la compañía con la cual desea conectarse el vendedor</param>
    /// <returns></returns>
    public bool LogInSalesman(string username, string password, string company)
    {
        return _webService.LogInSalesman(username, password, company);
    }

    /// <summary>
    /// Obtiene todos los items disponibles. Esto contiene la información de la cantidad de items por bodega, sus respectivas
    /// cuentas, fotografías, todo lo referente a artículos.
    /// </summary>
    /// <returns></returns>
    public ERPSIA.Item[] GetAvailableItems()
    {
        if(_items == null)
            _items = _webService.GetItems();
        return _items;
    }

    /// <summary>
    /// Obtiene las bodegas existentes en la compañía
    /// </summary>
    /// <returns></returns>
    public ERPSIA.StoreRoom[] GetStoreRooms()
    {
        if (_storeRooms == null)
            _storeRooms = _webService.GetStoreRooms();
        return _storeRooms;
    }

    /// <summary>
    /// Obtiene el impuesto default a aplicar en las ordenes de venta.
    /// </summary>
    /// <returns></returns>
    public ERPSIA.Tax GetDefaultTax()
    {
        if(_defaultTax == null)
            _defaultTax = _webService.GetDefaultTax();
        return _defaultTax;
    }

    /// <summary>
    /// Obtiene todas las monedas sobre las que se puede registrar ventas
    /// </summary>
    /// <returns></returns>
    public ERPSIA.Currency[] GetCurrencies()
    {
        if (_currencies == null)
            _currencies = _webService.GetCurrencies();
        return _currencies;
    }

    /// <summary>
    /// Obtiene los clientes registrados en la empresa
    /// </summary>
    /// <returns></returns>
    public ERPSIA.AuxiliarAccount[] GetClients()
    {
        if (_clients == null)
            _clients = _webService.GetClients();
        return _clients;
    }

    /// <summary>
    /// Guarda una orden de venta
    /// </summary>
    /// <returns></returns>
    public bool SaveSaleOrder(int clientId, DateTime postingDate, DateTime deliveryDate, int currencyId, double amountBeforeTax, double taxAmount, ERPSIA.DocDetail[] details)
    {
        return _webService.SaveOrderDocument(clientId, postingDate, deliveryDate, currencyId, amountBeforeTax, taxAmount, amountBeforeTax + taxAmount, details);
    }

    /// <summary>
    /// Obtiene toda la información de un cliente (para las consultas del caso)
    /// </summary>
    /// <param name="clientId">Id de la cuenta auxiliar</param>
    /// <returns></returns>
    public ERPSIA.SaleReport[] GetClientInformation(int clientId, int itemId)
    {
        _saleReports = _webService.GetSaleReport(clientId, itemId);
        return _saleReports;
    }

    public ERPSIA.SaleReportHistoryDetail[] GetSaleHistory(int clientId, int itemId)
    {
        foreach (ERPSIA.SaleReport report in _saleReports)
            if (report.ClientId == clientId && report.ItemId == itemId)
                return report.SaleHistory;
        return null;
    }

    #endregion
}